#!/bin/bash

# 设置颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

echo
echo "=========================================="
echo "   🚀 APIViewer 医学图像处理系统启动器"
echo "=========================================="
echo

# 检查Node.js是否安装
if ! command -v node &> /dev/null; then
    echo -e "${RED}❌ 错误: 未找到 Node.js${NC}"
    echo -e "${YELLOW}💡 请先安装 Node.js: https://nodejs.org/${NC}"
    exit 1
fi

# 检查Python是否安装
if ! command -v python &> /dev/null && ! command -v python3 &> /dev/null; then
    echo -e "${RED}❌ 错误: 未找到 Python${NC}"
    echo -e "${YELLOW}💡 请先安装 Python: https://python.org/${NC}"
    exit 1
fi

# 确定Python命令
PYTHON_CMD="python"
if command -v python3 &> /dev/null; then
    PYTHON_CMD="python3"
fi

echo -e "${BLUE}🔍 检查项目结构...${NC}"
if [ ! -f "frontend/package.json" ]; then
    echo -e "${RED}❌ 错误: 前端项目不存在${NC}"
    echo -e "${YELLOW}💡 请确保在正确的项目目录下运行此脚本${NC}"
    exit 1
fi

if [ ! -f "backend/main.py" ]; then
    echo -e "${RED}❌ 错误: 后端项目不存在${NC}"
    echo -e "${YELLOW}💡 请确保在正确的项目目录下运行此脚本${NC}"
    exit 1
fi

echo
echo -e "${CYAN}📋 选择启动模式:${NC}"
echo "[1] 只启动前端 (端口 3000)"
echo "[2] 只启动后端 (端口 8000)"
echo "[3] 同时启动前后端 (推荐)"
echo "[4] 安装依赖并启动"
echo "[0] 退出"
echo
read -p "请选择 (1-4, 0): " choice

case $choice in
    1)
        start_frontend
        ;;
    2)
        start_backend
        ;;
    3)
        start_both
        ;;
    4)
        install_and_start
        ;;
    0)
        exit 0
        ;;
    *)
        echo -e "${RED}❌ 无效选择，请重新运行脚本${NC}"
        exit 1
        ;;
esac

install_and_start() {
    echo
    echo -e "${BLUE}🔧 正在安装依赖...${NC}"
    echo
    echo -e "${CYAN}📦 安装前端依赖...${NC}"
    cd frontend
    npm install
    if [ $? -ne 0 ]; then
        echo -e "${RED}❌ 前端依赖安装失败${NC}"
        exit 1
    fi
    cd ..

    echo
    echo -e "${CYAN}🐍 安装后端依赖...${NC}"
    cd backend
    pip install -r requirements.txt || pip3 install -r requirements.txt
    if [ $? -ne 0 ]; then
        echo -e "${RED}❌ 后端依赖安装失败${NC}"
        exit 1
    fi
    cd ..

    echo
    echo -e "${GREEN}✅ 依赖安装完成${NC}"
    echo
    start_both
}

start_frontend() {
    echo
    echo -e "${BLUE}🌐 启动前端开发服务器...${NC}"
    echo -e "${CYAN}📍 访问地址: http://localhost:3000${NC}"
    echo -e "${YELLOW}🛑 按 Ctrl+C 停止服务器${NC}"
    echo
    cd frontend
    npm run dev
}

start_backend() {
    echo
    echo -e "${BLUE}🔧 检查后端环境变量配置...${NC}"
    if [ ! -f "backend/.env" ]; then
        echo -e "${YELLOW}⚠️  未找到 .env 配置文件，使用默认配置${NC}"
    fi
    echo
    echo -e "${BLUE}🐍 启动后端API服务器...${NC}"
    echo -e "${CYAN}📍 API地址: http://localhost:8000${NC}"
    echo -e "${CYAN}📖 API文档: http://localhost:8000/docs${NC}"
    echo -e "${YELLOW}🛑 按 Ctrl+C 停止服务器${NC}"
    echo
    cd backend
    $PYTHON_CMD main.py
}

start_both() {
    echo
    echo -e "${GREEN}🚀 同时启动前端和后端...${NC}"
    echo
    echo -e "${CYAN}📍 前端地址: http://localhost:3000${NC}"
    echo -e "${CYAN}📍 后端地址: http://localhost:8000${NC}"
    echo -e "${CYAN}📖 API文档: http://localhost:8000/docs${NC}"
    echo
    echo -e "${YELLOW}🛑 按 Ctrl+C 停止所有服务${NC}"
    echo

    # 设置信号处理
    trap 'kill $(jobs -p) 2>/dev/null; echo -e "\n${YELLOW}👋 正在停止所有服务...${NC}"; exit' INT

    # 启动后端
    echo -e "${BLUE}🔧 启动后端服务...${NC}"
    cd backend
    $PYTHON_CMD main.py &
    BACKEND_PID=$!
    cd ..

    # 等待后端启动
    echo -e "${YELLOW}⏳ 等待后端启动...${NC}"
    sleep 3

    # 启动前端
    echo -e "${BLUE}🌐 启动前端服务...${NC}"
    cd frontend
    npm run dev &
    FRONTEND_PID=$!
    cd ..

    echo
    echo -e "${GREEN}✅ 服务启动完成!${NC}"
    echo
    echo -e "${CYAN}🌐 请访问: http://localhost:3000${NC}"
    echo -e "${CYAN}📖 API文档: http://localhost:8000/docs${NC}"
    echo
    echo -e "${YELLOW}💡 提示:${NC}"
    echo "   - 按 Ctrl+C 停止所有服务"
    echo "   - 首次运行请选择选项4安装依赖"
    echo "   - 遇到问题请查看终端错误信息"
    echo

    # 等待进程
    wait $BACKEND_PID $FRONTEND_PID
}

# 函数定义必须在调用之前，所以重新执行选择逻辑
case $choice in
    1)
        start_frontend
        ;;
    2)
        start_backend
        ;;
    3)
        start_both
        ;;
    4)
        install_and_start
        ;;
    0)
        exit 0
        ;;
    *)
        echo -e "${RED}❌ 无效选择，请重新运行脚本${NC}"
        exit 1
        ;;
esac 